
/**
 * || 和 && 首先会对第一个操作数（a 和 c ）执行条件判断，
 * 如果其不是布尔值（如上例）就先进行 ToBoolean
 * 强制类型转换，然后再执行条件判断。
 * 
 * 对于 || 来说，如果条件判断结果为 true 就返回第一个操作数（a 和 c ）的值，
 * 如果为 false就返回第二个操作数（b）的值。
 * 
 * && 则相反，如果条件判断结果为 true 就返回第二个操作数（b ）的值，
 * 如果为 false 就返回第一个操作数（a 和 c ）的值。
 * 
 * || 和 && 返回它们其中一个操作数的值，
 * 而非条件判断的结果（其中可能涉及强制类型转换）。
 * 
 * 
 * c && b 中 c 为 null ，是一个假值，因此 && 表达式的结果是 null （即 c 的值），
 * 而非条件判断的结果 false。
 */

var a = 42;
var b = "abc";
var c = null;

console.log(a || b);     // 42
console.log(a && b);     // "abc"

console.log(c || b);     // "abc"
console.log(c && b);     // null

/*
“a || b;
// 大致相当于(roughly equivalent to):
a ? a : b;

a && b;
// 大致相当于(roughly equivalent to):
a ? b : a;”


*/


function saySomething(a, b) {

    a = a || "你好"
    b = b || "世界"

    console.log(a,b);
}
saySomething()

saySomething("燕燕","吃饭饭")

// 注意："" 是一个 false 值，所以 || 运算符会将 "" 视作为 false， 而使用 "世界"
saySomething("燕燕","")



function foo() {
    console.log( a );
}

var a = 42;

const result = a && foo()
console.log("返回的结果是 foo() 执行的结果",result===undefined);


// && 不常用，一般是使用 if 来代替，&& 一般只在被压缩过后的js中才使用
if(a){
    foo() 
}